// function f1() {
//   console.log(this);
// }

// function f2() {
//   "use strict";
//   console.log("f2->", this);
// }

// f1();
// f2();

// const foo = {
//   bar: 10,
//   fn: function () {
//     console.log(this == global);
//     console.log(this.bar);
//   },
// };

// var fn1 = foo.fn;

// fn1();

// const foo = {
//   bar: 10,
//   fn: function () {
//     console.log(this);
//     console.log(this.bar);
//   },
// };

// foo.fn();

// const o1 = {
//   text: "01",
//   fn: function () {
//     return this.text;
//   },
// };

// const o2 = {
//   text: "02",
//   fn: function () {
//     return o1.fn();
//   },
// };

// const o3 = {
//   text: "o3",
//   fn: function () {
//     var fn = o1.fn;
//     return fn();
//   },
// };

// console.log(o1.fn());
// console.log(o2.fn());
// console.log(o3.fn());

// var obj = {};
// var f = function () {
//   return this;
// };

// console.log(f() === globalThis);
// console.log(f.call(obj) === obj);

// var n = 123;
// var obj = { n: 456 };
// function a() {
//   console.log(this.n);
// }

// a.call();
// a.call(null);
// a.call(undefined);
// a.call(globalThis);
// a.call(obj);

// var f = function () {
//   return this;
// };

// console.log(f.call(5));

// var obj = {};

// obj.hasOwnProperty("toString");

// // 覆盖掉继承的hasOwnProperty方法
// obj.hasOwnProperty = function () {
//   return true;
// };

// obj.hasOwnProperty("toString");

// Object.prototype.hasOwnProperty.call(obj, "toString");

// var add = function (x, y) {
//   console.log(x, y);
//   return x * this.m + y * this.n;
// };

// var obj = { m: 2, n: 2 };

// var newAdd = add.bind(obj, 5);

// var d = new Date();

// console.log(d.getTime());

// var print = d.getTime.bind(d);
// console.log(print());
var x = 20;
const obj = {
  x: 10,
  test: () => {
    console.log(this); // {}
    console.log(this.x); //undefined
  },
};
obj.test();
